#ifndef __WFFS_DEBUG_H__
#define __WFFS_DEBUG_H__

#include "wffs.h"

#define DBG_ERR                 0x00000001
#define DBG_WARN                0x00000002
#define DBG_MSG                 0x00000004
#define DBG_SUPER               0x00000010 
#define DEBUG_INODE             0x00000020

#define WFFS_ERROR_PREFIX       "[WFFS ERROR]"
#define WFFS_WARNING_PREFIX    	"[WFFS WARNING]"
#define WFFS_DBG_PREFIX	        "[WFFS DBG]"
#define WFFS_DBG_SUPER_PREFIX	"[WFFS DBG SUPER]"
#define WFFS_DBG_INODE_PREFIX	"[WFFS DBG INODE]"

#define WFFS_ERROR(fmt, ...)						            \
	do {								                        \
		printf(WFFS_ERROR_PREFIX				                \
			" %s: " fmt, __FUNCTION__ , ##__VA_ARGS__);			\
	} while(0)

#define WFFS_WARNING(fmt, ...)						            \
	do {								                        \
		printf(WFFS_WARNING_PREFIX				                \
			" %s: " fmt, __FUNCTION__ , ##__VA_ARGS__);			\
	} while(0)

#define WFFS_DEBUG(fmt, ...)						            \
	do {								                        \
		printf(WFFS_DBG_PREFIX				                    \
			" %s: " fmt, __FUNCTION__ , ##__VA_ARGS__);			\
	} while(0)

#define WFFS_DEBUG_SUPER(fmt, ...)						        \
	do {								                        \
		printf(WFFS_DBG_SUPER_PREFIX				            \
			" %s: " fmt, __FUNCTION__ , ##__VA_ARGS__);			\
	} while(0)

#define WFFS_DEBUG_INODE(fmt, ...)						        \
	do {								                        \
		printf(WFFS_DBG_INODE_PREFIX				            \
			" %s: " fmt, __FUNCTION__ , ##__VA_ARGS__);			\
	} while(0)


#ifdef DEBUG
    int debug_mark = DBG_ERR | DBG_WARN | DBG_MSG | DBG_SUPER |DEBUG_INODE;

	#define wffs_err(fmt, ...)	 if (debug_mark & DBG_ERR)   WFFS_ERROR(fmt, ##__VA_ARGS__)
	#define wffs_warn(fmt, ...)  if (debug_mark & DBG_WARN)  WFFS_WARNING(fmt, ##__VA_ARGS__)
	#define dbg(fmt, ...)	     if (debug_mark & DBG_MSG)   WFFS_DEBUG(fmt, ##__VA_ARGS__)
	#define dbg_super(fmt, ...)	 if (debug_mark & DBG_SUPER) WFFS_DEBUG_SUPER(fmt, ##__VA_ARGS__)
	#define dbg_inode(fmt, ...)	 if (debug_mark & DBG_INODE) WFFS_DEBUG_INODE(fmt, ##__VA_ARGS__)
#else
	#define wffs_err(fmt, ...)
	#define wffs_warn(fmt, ...)
	#define dbg(fmt, ...)	
	#define dbg_super(fmt, ...)	
	#define dbg_inode(fmt, ...)	
#endif

#endif /* __WFFS_DEBUG_H__ */
